package com.gy.boot.common.util;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTool {
	public final static String PATTERN_TIME = "yyyy-MM-dd HH:mm:ss";
	
	/**
	 * 转换时间为String
	 * */
	public static String format(Date date, String pattern) {
		date = date == null ? new Date() : date;
		pattern = BlankUtil.isBlank(pattern) ? PATTERN_TIME :pattern;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		return simpleDateFormat.format(date);
	}
	/**
	 * 转换String时间为Date
	 * */
	public static Date parse(String date, String pattern) {
		if (BlankUtil.isBlank(date)) {
			return null;
		}
		pattern = BlankUtil.isBlank(pattern) ? PATTERN_TIME :pattern;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		try {
			return simpleDateFormat.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取单元格时间; yyyy-MM-dd HH:mm:ss
	 * @param val Excel单元格时间日期:  34094,  yyyy/MM/dd, yyyy/M/d, ...等格式
	 * */
	public static String getCellDayValueStr(String val) {
		DateTime date = getCellDayValue(val);
		if (date == null) { return null; }
		return date.toString();
	}
	public static DateTime getCellDayValue(String val) {
		if (BlankUtil.isBlank(val)) { return null; }
		try {
			int valLen = val.length();
			if (NumberUtil.isInteger(val)) {
				if (valLen == 8) {
					return cn.hutool.core.date.DateUtil.parse(val, "yyyyMMdd");
				}
				int valI = Integer.parseInt(val);
				DateTime date1900 = cn.hutool.core.date.DateUtil.parseDate("1900-01-01");
				return date1900.offset(DateField.DAY_OF_YEAR, valI-2);
			}
			String format = null;

			if (val.contains("-") && val.contains(":")) {
				if (valLen == 19) { format = "yyyy-MM-dd HH:mm:ss" ; }

			}
			if (val.length() == 19 && val.contains("-") && val.contains(":")) {
				format = "yyyy-MM-dd HH:mm:ss";
			} else if (val.length() == 17 && !val.contains("-") && val.contains(":")) { // 20201021 04:03:03
				format = "yyyyMMdd HH:mm:ss";
			} else if (val.contains("-")) {
				if (val.contains(":")) {
					format = "yyyy-M-d HH:mm:ss";
				} else {
					format = "yyyy-M-d";
				}
			} else if (val.contains("/")) { // yyyy/MM/dd
				boolean isMdYY = val.substring(0, val.indexOf("/")).length() != 4;
				format = isMdYY ? "M/d/yy" : "yyyy/M/d";
			} else if (val.contains("年")) {
				if (val.contains("秒")) {
					format = "yyyy年M月d日HH时mm分ss秒";
				} else if (val.contains("分")) {
					format = "yyyy年M月d日HH时mm分";
				} else if (val.contains("时")) {
					format = "yyyy年M月d日HH时";
				} else {
					format = "yyyy年M月d日";
				}
			}
			if (format != null) {
				return cn.hutool.core.date.DateUtil.parse(val, format);
			} else {
				throw new RuntimeException("日期格式错误,请检查日期格式");
			}
		} catch (Exception e) {
			throw new RuntimeException("日期格式错误,请检查日期格式");
		}
	}

	/** 匹配日期-可匹配年月 */
	public static DateTime parseDate(String val) {
		try {
			String format = getFormat(val);
			System.out.println(val + "匹配到的日期模板:" + format);
			if (BlankUtil.isBlankNull(format)) {
				return cn.hutool.core.date.DateUtil.parse(val);
			}
			if ("1900".equals(format)) {
				int valI = Integer.parseInt(val);
				DateTime date1900 = cn.hutool.core.date.DateUtil.parseDate("1900-01-01");
				return date1900.offset(DateField.DAY_OF_YEAR, valI-2);
			} else {
				return cn.hutool.core.date.DateUtil.parse(val, format);
			}
		} catch (Exception e) {
			System.out.println(val + "解析日期格式错误:" + e.getMessage());
			throw new RuntimeException(" 格式错误");
		}
	}
	/** 判断是否为纯数字 */
	public static boolean isPureInt(String str) {
		if (str == null || str.isEmpty()) { return false; }
		return str.matches("[0-9]+");
	}
	/** 匹配格式 */
	private static String getFormat(String val) {
		if (BlankUtil.isBlank(val)) { return null; }
		int valLen = val.length();
		// 纯数字处理
		boolean isInt = isPureInt(val); // 判断是否为纯数字
		if (isInt) {
			String f2 = "yyyyMMddHHmmss"; if (valLen == f2.length()) { return f2; }
			String f3 = "yyyyMMddHHmm"; if (valLen == f3.length()) { return f3; }
			String f1 = "yyyyMMdd"; if (valLen == f1.length()) { return f1; }
			String f4 = "yyyyMM"; if (valLen == f4.length()) { return f4; }
			if (valLen < f4.length()) { return "1900"; } // 需要通过1900年计算,超过2173年数值会和上面冲突
		}
		// 年月日处理
		if (val.contains("年")) {
			if (val.endsWith("秒")) { return "yyyy年M月d日HH时mm分ss秒"; }
			if (val.endsWith("分")) { return "yyyy年M月d日HH时mm分"; }
			if (val.endsWith("时")) { return "yyyy年M月d日HH时"; }
			if (val.endsWith("日")) { return "yyyy年M月d日"; }
			if (val.endsWith("月")) { return "yyyy年M月"; }
		}
		// 通过链接符处理
		String[] valArr = val.split(" ");
		String ymd = valArr[0]; // 年月日
		String hms1 = valArr.length > 1 ? valArr[1] : null; // 时分秒
		String hms = BlankUtil.isBlankNull(hms1) ? null : hms1; // 时分秒-空处理
		String fHms1 = hms == null ? "" : (" " + ("HHmmss".length() == hms.length() ? "HHmmss" : "HHmm"));
		String fHms2 = hms == null ? "" : (" " + ("HH:mm:ss".length() == hms.length() ? "HH:mm:ss" : "HH:mm"));
		String fHms = val.contains(":") ? fHms2 : fHms1;
		if (val.contains("-")) {
			String[] ymdArr = ymd.split("-");
			String y = ymdArr[0]; String m = ymdArr[1];
			int yLen = y.length(); int mLen = m.length();
			boolean isY4 = yLen == 4; boolean isY2 = yLen == 2; // yyyy 或 yy
			boolean isM2 = mLen == 2; boolean isM1 = mLen == 1; // MM 或 M
			if (isY4) { // yyyy
				if (isM2) { // MM
					String f1 = "yyyy-MM-dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yyyy-MM-d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yyyy-MM"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				if (isM1) { // M
					String f1 = "yyyy-M-dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yyyy-M-d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yyyy-M"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				return null;
			}
			if (isY2) { // yy
				if (isM2) { // MM
					String f1 = "yy-MM-dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yy-MM-d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yy-MM"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				if (isM1) { // M
					String f1 = "yy-M-dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yy-M-d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yy-M"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				return null;
			}
		}
		if (val.contains("/")) {
			String[] ymdArr = ymd.split("/");
			String y = ymdArr[0]; String m = ymdArr[1];
			int yLen = y.length(); int mLen = m.length();
			boolean isY4 = yLen == 4; boolean isY2 = yLen == 2; // yyyy 或 yy
			boolean isM2 = mLen == 2; boolean isM1 = mLen == 1; // MM 或 M
			if (isY4) { // yyyy
				if (isM2) { // MM
					String f1 = "yyyy/MM/dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yyyy/MM/d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yyyy/MM"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				if (isM1) { // M
					String f1 = "yyyy/M/dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yyyy/M/d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yyyy/M"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				return null;
			}
			if (hms == null) { // 没有时分秒; 判断年份
				int yi = StrTool.valueOfInt(y);
				if (yi <= 12) { // 年份小于最大月份(这块只能用到2099年,超过无法判断)
					String f7 = "MM/dd/yy"; if (valLen == f7.length()) { return f7; }
					String f6 = "M/d/yy"; if (valLen == f6.length()) { return f6; }
				}
			}
			if (isY2) { // yy
				if (isM2) { // MM
					String f1 = "yy/MM/dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yy/MM/d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yy/MM"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				if (isM1) { // M
					String f1 = "yy/M/dd"+fHms; if (valLen == f1.length()) { return f1; }
					String f2 = "yy/M/d"+fHms; if (valLen == f2.length()) { return f2; }
					if (hms == null) { String f3 = "yy/M"; if (valLen == f3.length()) { return f3; } }
					return null;
				}
				return null;
			}
		}
		if (!val.contains("-") && !val.contains("/") && val.contains(":")) {
			String f1 = "yyyyMMdd"+fHms; if (valLen == f1.length()) { return f1; }
		}
		return null;
	}


	public static String getEffectStatusName(String start_date, String end_date, String format) {
		if (BlankUtil.isBlankNull(start_date) || BlankUtil.isBlankNull(end_date)) {
			return "";
		}
		format = BlankUtil.isBlankNull(format) ? "yyyy-MM-dd" : format;
		DateTime startDate = cn.hutool.core.date.DateUtil.parse(start_date, format); // 结束时间
		DateTime endDate = cn.hutool.core.date.DateUtil.parse(end_date, format); // 开始时间
		DateTime nowDate = cn.hutool.core.date.DateUtil.parse(DateUtil.date().toDateStr(), format); // 当前时间
		if (nowDate.before(startDate)) { // 当前时间在开始时间之前
			return "未生效";
		}
		if (nowDate.after(endDate)) {
			return "已过期";
		}
		return "已生效";
	}
}
